﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web.Management;
using dao.commons;
using dao.daos;
using negocio.commons;
using negocio.entidades;
using negocio.readOnly;

namespace negocio.servicios
{
    public class PedidoService : IService<Pedido>
    {
        PedidoDao dao = new PedidoDao();

        public List<Pedido> ObtenerTodo()
        {
            return LeerDataReaderList(dao.ObtenerTodo());
        }

        public List<Pedido> ObtenerActivos()
        {
            return LeerDataReaderList(dao.ObtenerActivos());
        }

        public Pedido ObtenerPorId(int id)
        {
            SqlDataReader dr = dao.ObtenerPorId(id);
            return LeerDataReader(dr);
        }

        public bool Existe(Pedido busObject)
        {
            throw new System.NotImplementedException();
        }

        public void Eliminar(Pedido busObject)
        {
            dao.Eliminar(busObject.Id);
        }

        public void Insertar(Pedido busObject)
        {
            SqlConnection con = new SqlConnection();
            SqlTransaction trans = null;
            try
            {
                con.ConnectionString = dao.StringConexion;
                con.Open();
                trans = con.BeginTransaction();

                int idPedido = dao.Insertar(con, trans, busObject.IdProveedor, busObject.FechaAlta, busObject.IdEstadoPedido);
                
                for (int i = 0; i < busObject.ListaDetalles.Count; i++)
                {
                    int idProducto = busObject.ListaDetalles[i].IdProducto;
                    int cant = busObject.ListaDetalles[i].Cantidad;
                    dao.InsertarDetallePedido(con, trans, idPedido, idProducto, cant);
                }

                trans.Commit();
            }
            catch (Exception  e)
            {
                if (trans != null)
                    trans.Rollback();

                throw new SqlExecutionException("Error al insertar detalle de pedido", e);
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                    con.Close();
            }
        }

        public void Modificar(Pedido busObject)
        {
            string valores = GenerarStringValores(busObject);
            string restriccion = string.Format("ID_PEDIDO = {0}", busObject.Id);
            dao.Modificar(valores, restriccion);
        }

        public IList<IdNombreReadOnly> ObtenerPedidosEnEstadoActivo()
        {
            return LeerDataReaderIdNombreList(dao.ObtenerPedidosEnEstadoActivo());
        }

        #region SOPORTE
        private string GenerarStringValores(Pedido pedido)
        {
            string valores =
                string.Format(
                    "ID_PROVEEDOR ={0}, FECHA ={1}, ID_ESTADO_PEDIDO ={2}",
                    pedido.IdProveedor,
                    pedido.FechaAlta.ToShortDateString(),
                    pedido.IdEstadoPedido
                    );
            return valores;
        }

        private Pedido LeerDataReader(SqlDataReader dr)
        {
            Pedido bus = new Pedido();
            if (dr.Read())
            {
                bus.Id = SafeReader.GetSafeInt(dr, "ID_PEDIDO");
                bus.IdProveedor = SafeReader.GetSafeInt(dr, "ID_PROVEEDOR");
                bus.IdEstadoPedido = SafeReader.GetSafeInt(dr, "ID_ESTADO_PEDIDO");
                bus.FechaAlta = SafeReader.GetSafeDate(dr, "FECHA");
            }
            dr.Close();
            return bus;
        }

        private List<Pedido> LeerDataReaderList(SqlDataReader dr)
        {
            List<Pedido> listbBus = new List<Pedido>();
            while (dr.Read())
            {
                Pedido bus = new Pedido();
                bus.Id = SafeReader.GetSafeInt(dr, "ID_PEDIDO");
                bus.IdProveedor = SafeReader.GetSafeInt(dr, "ID_PROVEEDOR");
                bus.IdEstadoPedido = SafeReader.GetSafeInt(dr, "ID_ESTADO_PEDIDO");
                bus.FechaAlta = SafeReader.GetSafeDate(dr, "FECHA");
                listbBus.Add(bus);
            }

            dr.Close();
            return listbBus;
        }

        private List<IdNombreReadOnly> LeerDataReaderIdNombreList(SqlDataReader dr)
        {
            List<IdNombreReadOnly> listbBus = new List<IdNombreReadOnly>();
            while (dr.Read())
            {
                IdNombreReadOnly bus = new IdNombreReadOnly();
                bus.Id = SafeReader.GetSafeInt(dr, "ID_PEDIDO");
                bus.Nombre = string.Format("{0} - {1}", SafeReader.GetSafeString(dr, "RAZON_SOCIAL"), SafeReader.GetSafeDate(dr, "FECHA").ToShortDateString());
                listbBus.Add(bus);
            }

            dr.Close();
            return listbBus;
        }

        public int maximoIdPedido()
        {
            int valor = 0;
            SqlDataReader dr = dao.traerDatosConsulta("SELECT MAX(ped.ID_PEDIDO) as 'ID_PEDIDO' FROM PEDIDO ped");
            while (dr.Read())
            {
                valor = SafeReader.GetSafeInt(dr, "ID_PEDIDO");
            }
            return valor;
        }

        #endregion
    }
}
